ํ๋ก ํธ์๋ ์ ๊ทผ์ฑ ํ ์คํธ ์๋ํ ๋ฐ WCAG์ ๊ฐ์ ๊ธ๋ก๋ฒ ์ ๊ทผ์ฑ ํ์ค ์ค์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ก, ์ค์ฉ์ ์ธ ์ ๋ต๊ณผ ๋๊ตฌ๋ฅผ ์ถ์ฒํฉ๋๋ค.
ํ๋ก ํธ์๋ ์ ๊ทผ์ฑ ์๋ํ: ํ ์คํธ ๋ฐ ๊ท์ ์ค์ ๊ฒ์ฆ
์ค๋๋ ์ ๋์งํธ ํ๊ฒฝ์์, ์ฅ์ ๊ฐ ์๋ ๊ฐ์ธ์ ํฌํจํ ๋ชจ๋ ์ฌ๋์ด ์น์ฌ์ดํธ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ ๋จ์ํ ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ์๋๋ผ ์ข ์ข ๋ฒ์ ์๊ตฌ ์ฌํญ์ ๋๋ค. ์น ์ ๊ทผ์ฑ์ ํฌ์ฉ์ฑ์ ์ํด ๋งค์ฐ ์ค์ํ๋ฉฐ, ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ํ๋ํ๊ณ ๊ธฐ์ ์ ์ฌํ์ ์ฑ ์์ ๋ณด์ฌ์ฃผ๋ ๊ธธ์ด๊ธฐ๋ ํฉ๋๋ค. ์ด ๊ธ์์๋ ํ ์คํธ ๋ฐฉ๋ฒ๋ก ๊ณผ ๊ธ๋ก๋ฒ ํ์ค ์ถฉ์กฑ์ ์ํ ๊ท์ ์ค์ ๊ฒ์ฆ์ ์ด์ ์ ๋ง์ถฐ ํ๋ก ํธ์๋ ์ ๊ทผ์ฑ ์๋ํ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ๋ก ํธ์๋ ์ ๊ทผ์ฑ ํ ์คํธ๋ฅผ ์๋ํํด์ผ ํ๋ ์ด์
์๋ ์ ๊ทผ์ฑ ํ ์คํธ๋ ์ค์ํ์ง๋ง, ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๊ณ ์ฌ๋์ ์ค์์ ์ทจ์ฝํ ์ ์์ต๋๋ค. ์๋ํ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํจ์จ์ฑ: ์๋ํ๋ ํ ์คํธ๋ ๋น ๋ฅด๊ณ ๋ฐ๋ณต์ ์ผ๋ก ์คํํ ์ ์์ด ์ง์์ ์ธ ํตํฉ ๋ฐ ์ง์์ ์ธ ์ ๊ณต(CI/CD) ํ์ดํ๋ผ์ธ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์ผ๊ด์ฑ: ์๋ํ๋ ํ ์คํธ๋ ์ ๊ทผ์ฑ ํ์ค์ ๋ํ ์ผ๊ด๋ ํ๊ฐ๋ฅผ ๋ณด์ฅํ์ฌ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ๊ฐ๊ณผํ ์ํ์ ์ค์ ๋๋ค.
- ์กฐ๊ธฐ ๋ฐ๊ฒฌ: ๊ฐ๋ฐ ์์ ์ฃผ๊ธฐ ์ด๊ธฐ์ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ฉด ์์ ๋น์ฉ๊ณผ ๋ ธ๋ ฅ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
- ํ์ฅ์ฑ: ์๋ํ๋ ํ ์คํธ๋ ํฌ๊ณ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๊ฒ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค.
- ๋น์ฉ ํจ์จ์ฑ: ์ด๊ธฐ ํฌ์๊ฐ ์์ง๋ง, ์๋ํ๋ ํ ์คํธ๋ ๊ถ๊ทน์ ์ผ๋ก ์ ๊ทผ์ฑ ์์ ๋ฐ ๋ฒ๊ท ์ค์์ ๊ด๋ จ๋ ์ฅ๊ธฐ์ ์ธ ๋น์ฉ์ ์ ๊ฐํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ ๊ทผ์ฑ ํ์ค์ ์ดํด: WCAG์ ๊ทธ ์ด์
์น ์ฝํ ์ธ ์ ๊ทผ์ฑ ๊ฐ์ด๋๋ผ์ธ(WCAG)์ ์น ์ ๊ทผ์ฑ์ ๋ํ ๊ตญ์ ์ ์ผ๋ก ์ธ์ ๋ ํ์ค์ ๋๋ค. WCAG๋ ์ธ ๊ฐ์ง ์ค์ ์์ค(A, AA, AAA)์ผ๋ก ๋ถ๋ฅ๋ ์ฑ๊ณต ๊ธฐ์ค ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋๋ถ๋ถ์ ์กฐ์ง์ ์ค์ฉ์ ์ด๊ณ ๋๋ฆฌ ์ธ์ ๋๋ ์ ๊ทผ์ฑ ์์ค์ ๋ํ๋ด๋ WCAG 2.1 AA ์ค์๋ฅผ ๋ชฉํ๋ก ํฉ๋๋ค.
WCAG ์ธ์๋ ์ผ๋ถ ๊ตญ๊ฐ ๋ฐ ์ง์ญ์๋ ๊ณ ์ ํ ํน์ ์ ๊ทผ์ฑ ๋ฒ๋ฅ ๋ฐ ๊ท์ ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์น์ 508 (๋ฏธ๊ตญ): ์ฐ๋ฐฉ ๊ธฐ๊ด์ ์ ์ ๋ฐ ์ ๋ณด ๊ธฐ์ ์ด ์ฅ์ ์ธ์๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์๋ฌดํํฉ๋๋ค. ์ข ์ข ๋ฏธ๊ตญ ์ ๊ทผ์ฑ ์๊ตฌ ์ฌํญ์ ๊ธฐ์ค์ ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
- ์จํ๋ฆฌ์ค ์ฅ์ ์ธ ์ ๊ทผ์ฑ ๋ฒ (AODA) (์บ๋๋ค): ์จํ๋ฆฌ์ค์ ๋ชจ๋ ์กฐ์ง์ด ์น์ฌ์ดํธ๋ฅผ ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๋๋ก ์๊ตฌํฉ๋๋ค.
- ์ ๋ฝ ์ ๊ทผ์ฑ ๋ฒ (EAA) (์ ๋ฝ ์ฐํฉ): EU ํ์๊ตญ ์ ๋ฐ์ ๊ฑธ์ณ ์น์ฌ์ดํธ ๋ฐ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌํจํ ๊ด๋ฒ์ํ ์ ํ ๋ฐ ์๋น์ค์ ๋ํ ์ ๊ทผ์ฑ ์๊ตฌ ์ฌํญ์ ์ค์ ํฉ๋๋ค.
- ์ฅ์ ์ธ ์ฐจ๋ณ ๊ธ์ง๋ฒ (DDA) (ํธ์ฃผ): ๋์งํธ ์์ญ์ ํฌํจํ์ฌ ์ฅ์ ์ธ์ ๋ํ ์ฐจ๋ณ์ ๊ธ์งํฉ๋๋ค.
- ์ผ๋ณธ ์ฐ์ ํ์ค (JIS) X 8341-3 (์ผ๋ณธ): WCAG์ ๋ฐ์ ํ๊ฒ ์ฐ๊ณ๋ ์น ์ฝํ ์ธ ์ ๊ทผ์ฑ์ ๋ํ ์ผ๋ณธ ํ์ค์ ๋๋ค.
์ด๋ฌํ ํ์ค์ ์ดํดํ๋ ๊ฒ์ ํฌ์ฉ์ ์ด๊ณ ๊ท์ ์ ์ค์ํ๋ ์น ๊ฒฝํ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํ๊ฒ ๊ณ ๊ฐ๊ณผ ๊ทธ๋ค์ด ๊ฑฐ์ฃผํ๋ ์ง์ญ์ด ํ์ค ์ ํ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
ํ๋ก ํธ์๋ ์ ๊ทผ์ฑ ํ ์คํธ ์๋ํ ์ ๋ต
ํจ๊ณผ์ ์ธ ์ ๊ทผ์ฑ ์๋ํ๋ ๊ฐ๋ฐ ์์ ์ฃผ๊ธฐ์ ์ฌ๋ฌ ๋จ๊ณ์ ํ ์คํธ๋ฅผ ํตํฉํ๋ ๋ค๊ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค.
1. ์ ์ ๋ถ์ (๋ฆฐํ )
์ข ์ข ๋ฆฐํฐ(linter)๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ ์ ๋ถ์ ๋๊ตฌ๋ ์ฝ๋๋ฅผ ์คํํ์ง ์๊ณ ๋ถ์ํฉ๋๋ค. ์ฝ๋ ํจํด๊ณผ ๊ตฌ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์ฌ์ ์ธ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ ํ๊ฒฝ ๋ฐ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉ๋ฉ๋๋ค.
์์:
- eslint-plugin-jsx-a11y: JSX ์ฝ๋์์ ์ ๊ทผ์ฑ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ฐ์ ํ๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ฉ ์ธ๊ธฐ ESLint ํ๋ฌ๊ทธ์ธ์ ๋๋ค. `img` ํ๊ทธ์ `alt` ์์ฑ ๋๋ฝ, ๋ถ์ถฉ๋ถํ ์์ ๋๋น, ARIA ์์ฑ์ ์๋ชป๋ ์ฌ์ฉ๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํ์ธํฉ๋๋ค.
- HTMLHint: HTML ํ์ค ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ทผ์ฑ ์๋ฐ์ ์๋ณํ ์ ์๋ HTML์ฉ ์ ์ ๋ถ์ ๋๊ตฌ์ ๋๋ค.
- axe-lint: axe-core ์ ๊ทผ์ฑ ํ ์คํธ ์์ง์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฆฐํฐ๋ก, ์ฝ๋ฉํ๋ ๋์ ํธ์ง๊ธฐ ๋ด์์ ์ง์ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค.
์ฌ์ฉ ์์ (eslint-plugin-jsx-a11y):
๋ค์ React ์ฝ๋๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์:
<img src="logo.png" />
eslint-plugin-jsx-a11y๋ `alt` ์์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ค๋ฅ๋ก ํ์ํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
<img src="logo.png" alt="Company Logo" />
2. ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ฉํ ์๋ํ๋ UI ํ ์คํธ
์๋ํ๋ UI ํ ์คํธ๋ ์น ๋ธ๋ผ์ฐ์ ๋ด์์ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. Chrome์ด๋ Firefox์ ๊ฐ์ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ๋ ๊ทธ๋ํฝ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์์ด ์ด๋ฌํ ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ด CI/CD ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
๋๊ตฌ:
- axe-core: Deque Systems์์ ๊ฐ๋ฐํ ์คํ ์์ค ์ ๊ทผ์ฑ ํ ์คํธ ์์ง์ ๋๋ค. WCAG ๋ฐ ๊ธฐํ ์ ๊ทผ์ฑ ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ํ ํฌ๊ด์ ์ธ ๊ท์น ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Cypress: axe-core์ ์ํํ๊ฒ ํตํฉ๋๋ ์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. ์ ๊ทผ์ฑ ์๋ฐ์ ํ์ธํ๋ ์๋-ํฌ-์๋ ํ ์คํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
- Selenium WebDriver: axe-core ๋๋ ๋ค๋ฅธ ์ ๊ทผ์ฑ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฐํฉํ ์ ์๋ ๋ ๋ค๋ฅธ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํฉ๋๋ค.
- Playwright: ์ต์ ์น ์ฑ์ ์ํ ์์ ์ ์ธ ์๋-ํฌ-์๋ ํ ์คํธ๋ฅผ ์ํ Microsoft์ ํ๋ ์์ํฌ์ ๋๋ค. Playwright๋ Chromium, Firefox, WebKit์ ์ง์ํฉ๋๋ค.
์ฌ์ฉ ์์ (Cypress์ axe-core):
์ด Cypress ํ ์คํธ๋ axe-core๋ฅผ ์ฌ์ฉํ์ฌ ์น ํ์ด์ง์ ์ ๊ทผ์ฑ์ ํ์ธํฉ๋๋ค:
describe('Accessibility Test', () => {
it('Checks for WCAG AA violations', () => {
cy.visit('https://www.example.com');
cy.injectAxe();
cy.checkA11y(null, { // Optional context and options
runOnly: {
type: 'tag',
values: ['wcag2a', 'wcag2aa']
}
});
});
});
์ด ํ ์คํธ๋ ๋ค์์ ์ํํฉ๋๋ค:
- ์ง์ ๋ URL์ ๋ฐฉ๋ฌธํฉ๋๋ค.
- ํ์ด์ง์ axe-core ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฃผ์ ํฉ๋๋ค.
- WCAG 2.1 A ๋ฐ AA ๊ธฐ์ค์ ๋ฐ๋ผ ์ ๊ทผ์ฑ ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค.
- ์๋ฐ ์ฌํญ์ด ๋ฐ๊ฒฌ๋๋ฉด ํ ์คํธ๋ฅผ ์คํจ ์ฒ๋ฆฌํฉ๋๋ค.
3. ๋์ ์ ๊ทผ์ฑ ๋ถ์
๋์ ์ ๊ทผ์ฑ ๋ถ์ ๋๊ตฌ๋ ์น ํ์ด์ง๊ฐ ์คํ๋๋ ๋์ ์ ๊ทผ์ฑ์ ๋ถ์ํฉ๋๋ค. ์ ์ ๋ถ์์ด๋ ์๋ํ๋ UI ํ ์คํธ ์ค์๋ ๋๋ฌ๋์ง ์๋ ๋ฌธ์ , ์๋ฅผ ๋ค์ด ํฌ์ปค์ค ๊ด๋ฆฌ ๋ฌธ์ ๋ ์ ๊ทผ์ฑ ์ฅ๋ฒฝ์ ์ ๋ฐํ๋ ๋์ ์ฝํ ์ธ ์ ๋ฐ์ดํธ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ ์ ์์ต๋๋ค.
๋๊ตฌ:
- axe DevTools: ์น ํ์ด์ง๋ฅผ ํ์ํ๊ณ ์ํธ ์์ฉํ๋ ๋์ ์ค์๊ฐ ์ ๊ทผ์ฑ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ ๋ฐ ๋ช ๋ น์ค ๋๊ตฌ์ ๋๋ค.
- WAVE (Web Accessibility Evaluation Tool): ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ์ ๊ทผ์ฑ ๋ฌธ์ ์ ๋ํ ์๊ฐ์ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ ๋๋ค. WebAIM์์ ๊ฐ๋ฐํ๊ณ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค.
- Siteimprove Accessibility Checker: ์๋ํ๋ ํ ์คํธ์ ์๋ ํ ์คํธ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ ๊ณตํ๋ ํฌ๊ด์ ์ธ ์ ๊ทผ์ฑ ํ ์คํธ ํ๋ซํผ์ ๋๋ค.
์ฌ์ฉ ์์ (axe DevTools):
Chrome์์ axe DevTools๋ฅผ ์ฌ์ฉํ๋ฉด ์น ํ์ด์ง๋ฅผ ๊ฒ์ฌํ๊ณ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ ํจ๋์์ ์ง์ ์ ๊ทผ์ฑ ์๋ฐ์ ์๋ณํ ์ ์์ต๋๋ค. ์ด ๋๊ตฌ๋ DOM์์์ ์์น์ ์์ ๊ถ์ฅ ์ฌํญ์ ํฌํจํ์ฌ ๊ฐ ์๋ฐ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
4. ์ ๊ทผ์ฑ์ ์ํ ์๊ฐ์ ํ๊ท ํ ์คํธ
์๊ฐ์ ํ๊ท ํ ์คํธ๋ UI ๋ณ๊ฒฝ์ด ์๋ํ์ง ์์ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๊ฑฐ๋ UI ๊ตฌ์ฑ ์์๋ฅผ ์ ๋ฐ์ดํธํ ๋ ํนํ ์ค์ํฉ๋๋ค.
๋๊ตฌ:
- Percy: UI์ ์ค๋ ์ท์ ์บก์ฒํ๊ณ ๋ค๋ฅธ ๋น๋์ ๋น๊ตํ์ฌ ์๊ฐ์ ํ๊ท๋ฅผ ๊ฐ์งํ๋ ์๊ฐ์ ๊ฒํ ํ๋ซํผ์ ๋๋ค.
- Applitools: AI๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ๋ํ๋ผ ์ ์๋ ๋ฏธ๋ฌํ ์๊ฐ์ ์ฐจ์ด๋ฅผ ์๋ณํ๋ ๋ ๋ค๋ฅธ ์๊ฐ์ ํ ์คํธ ํ๋ซํผ์ ๋๋ค.
- BackstopJS: ๋ฌด๋ฃ ์คํ ์์ค ์๊ฐ์ ํ๊ท ํ ์คํธ ๋๊ตฌ์ ๋๋ค.
์ ๊ทผ์ฑ ํ ์คํธ์ ํตํฉ:
์๊ฐ์ ํ๊ท ํ ์คํธ๋ ์ฃผ๋ก ์๊ฐ์ ๋ณ๊ฒฝ์ ์ค์ ์ ๋์ง๋ง, ์๊ฐ์ ํ๊ท ํ ์คํธ ์ํฌํ๋ก์ฐ์ axe-core๋ ๋ค๋ฅธ ์ ๊ทผ์ฑ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํฉํ์ฌ ์ ๊ทผ์ฑ ํ ์คํธ์ ํตํฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ ์๊ฐ์ ์ค๋ ์ท์ ์ ๊ทผ์ฑ์ ์๋์ผ๋ก ํ์ธํ๊ณ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ์๋ฐ ์ฌํญ์ ์๋ณํ ์ ์์ต๋๋ค.
์ ๊ทผ์ฑ ์ฐ์ CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
์ ๊ทผ์ฑ ํ ์คํธ๋ฅผ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ๋ ๊ฒ์ ์ง์์ ์ธ ์ ๊ทผ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ค์์ ๊ถ์ฅ๋๋ ์ํฌํ๋ก์ฐ์ ๋๋ค:
- ์ฝ๋ ๋ฆฐํ : ๊ฐ๋ฐ ๊ณผ์ ์ด๊ธฐ์ ์ ์ฌ์ ์ธ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ธฐ ์ํด ๋ชจ๋ ์ปค๋ฐ์ ๋ํด ์ ์ ๋ถ์ ๋๊ตฌ(์: eslint-plugin-jsx-a11y)๋ฅผ ์คํํฉ๋๋ค.
- ๋จ์ ํ ์คํธ: ๊ฐ๋ณ ๊ตฌ์ฑ ์์๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ์ง ํ์ธํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ์ ์ ๊ทผ์ฑ ๊ฒ์ฌ๋ฅผ ํตํฉํฉ๋๋ค.
- ์๋ํ๋ UI ํ ์คํธ: WCAG ์๋ฐ์ ํ์ธํ๊ธฐ ์ํด ๋ชจ๋ ๋น๋์์ ํค๋๋ฆฌ์ค ๋ธ๋ผ์ฐ์ ์ axe-core๋ก ์๋ํ๋ UI ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค.
- ์๊ฐ์ ํ๊ท ํ ์คํธ: UI์ ์๊ฐ์ ์ค๋ ์ท์ ์บก์ฒํ๊ณ ๋ค๋ฅธ ๋น๋์ ๋น๊ตํ์ฌ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ๋ํ๋ผ ์ ์๋ ์๊ฐ์ ํ๊ท๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ์๋ ํ ์คํธ: ์๋์ผ๋ก ๊ฐ์งํ ์ ์๋ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ ๊ทผ์ฑ ์ ๋ฌธ๊ฐ๋ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์ ์ํ ์๋ ํ ์คํธ๋ก ์๋ํ๋ ํ ์คํธ๋ฅผ ๋ณด์ํฉ๋๋ค.
CI/CD ๊ตฌ์ฑ ์์ (GitHub Actions):
name: Accessibility Testing
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
accessibility:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm install
- name: Run ESLint with accessibility checks
run: npm run lint # Assuming you have a lint script in your package.json
- name: Run Cypress with axe-core
run: npm run cypress:run # Assuming you have a cypress run script
ํ์์ ๋ง๋ ์ฌ๋ฐ๋ฅธ ๋๊ตฌ ์ ํ
์กฐ์ง์ ๊ฐ์ฅ ์ ํฉํ ์ ๊ทผ์ฑ ํ ์คํธ ๋๊ตฌ๋ ํน์ ์๊ตฌ ์ฌํญ, ์์ฐ ๋ฐ ๊ธฐ์ ์ ๋ฌธ์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ ํ ์ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ์ ์ฉ ๋ฒ์: ๋๊ตฌ๊ฐ ์ค์ํด์ผ ํ๋ ์ ๊ทผ์ฑ ํ์ค(์: WCAG, ์น์ 508)์ ๋ค๋ฃจ๊ณ ์์ต๋๊น?
- ์ ํ๋: ๋๊ตฌ๊ฐ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ์ผ๋ง๋ ์ ํํฉ๋๊น?
- ์ฌ์ฉ ์ฉ์ด์ฑ: ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ํตํฉํ๊ธฐ๊ฐ ์ผ๋ง๋ ์ฝ์ต๋๊น?
- ๋ณด๊ณ : ๋๊ตฌ๊ฐ ์ ๊ทผ์ฑ ์๋ฐ์ ๋ํด ๋ช ํํ๊ณ ์คํ ๊ฐ๋ฅํ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํฉ๋๊น?
- ๋น์ฉ: ๋ผ์ด์ ์ค ๋น์ฉ, ๊ต์ก ๋ฐ ์ง์์ ํฌํจํ ๋๊ตฌ์ ๋น์ฉ์ ์ผ๋ง์ ๋๊น?
- ์ปค๋ฎค๋ํฐ ์ง์: ์ง์๊ณผ ์ง์นจ์ ์ ๊ณตํ ์ ์๋ ๊ฐ๋ ฅํ ์ปค๋ฎค๋ํฐ๊ฐ ๋๊ตฌ ์ฃผ๋ณ์ ์์ต๋๊น?
์ต์์ ์ ๊ทผ์ฑ ์ ์ฉ ๋ฒ์๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ์กฐํฉํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข ์ข ๊ถ์ฅ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์กฐ๊ธฐ ๋ฐ๊ฒฌ์ ์ํ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ํ, axe-core๋ฅผ ์ด์ฉํ ์๋ํ๋ UI ํ ์คํธ๋ฅผ ์ํํ๊ณ , ์๋ ํ ์คํธ๋ก ๋ณด์ํ๋ ๋ฐฉ์์ ๋๋ค.
์ ๊ทผ์ฑ ์๋ํ์ ์ผ๋ฐ์ ์ธ ๊ณผ์ ํด๊ฒฐ
์ ๊ทผ์ฑ ์๋ํ๋ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ๋ช ๊ฐ์ง ๊ณผ์ ๋ ์์ต๋๋ค:
- ์คํ(False Positives): ์๋ํ๋ ๋๊ตฌ๋ ๋๋๋ก ์คํ์ ์์ฑํ ์ ์์ด, ๋ฌธ์ ๊ฐ ์ค์ ๋ก ์กด์ฌํ๋์ง ํ์ธํ๊ธฐ ์ํด ์๋ ๊ฒ์ฆ์ด ํ์ํฉ๋๋ค.
- ์ ํ๋ ์ ์ฉ ๋ฒ์: ์๋ํ๋ ํ ์คํธ๋ ๋ชจ๋ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ฑ ๋ฌธ์ ๋ ๋ฌธ๋งฅ์ ๋ฐ๋ฅธ ์ค๋ฅ์ ๊ฐ์ ์ผ๋ถ ๋ฌธ์ ๋ ์๋ ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.
- ์ ์ง ๊ด๋ฆฌ: ์ ๊ทผ์ฑ ํ์ค๊ณผ ํ ์คํธ ๋๊ตฌ๋ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๋ฏ๋ก ํ ์คํธ๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ๊ธฐ ์ํ ์ง์์ ์ธ ์ ์ง ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
- ํตํฉ ๋ณต์ก์ฑ: ๊ธฐ์กด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ์ ๊ทผ์ฑ ํ ์คํธ๋ฅผ ํตํฉํ๋ ๊ฒ์ ๋ณต์กํ๊ณ ์๋นํ ๋ ธ๋ ฅ์ด ํ์ํ ์ ์์ต๋๋ค.
- ๊ธฐ์ ๊ฒฉ์ฐจ: ์ ๊ทผ์ฑ ์๋ํ๋ฅผ ๊ตฌํํ๊ณ ์ ์ง ๊ด๋ฆฌํ๋ ค๋ฉด ์ ๋ฌธ์ ์ธ ๊ธฐ์ ๊ณผ ์ง์์ด ํ์ํฉ๋๋ค.
์ด๋ฌํ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ ์ฌํญ์ด ์ค์ํฉ๋๋ค:
- ๊ฒฐ๊ณผ ๊ฒ์ฆ: ์คํ์ ํผํ๊ธฐ ์ํด ํญ์ ์๋ํ๋ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ์๋์ผ๋ก ํ์ธํ์ญ์์ค.
- ์๋ํ ๋ฐ ์๋ ํ ์คํธ ๊ฒฐํฉ: ํฌ๊ด์ ์ธ ์ ๊ทผ์ฑ ์ ์ฉ ๋ฒ์๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์๋ํ๋ ํ ์คํธ์ ์๋ ํ ์คํธ๋ฅผ ์กฐํฉํ์ฌ ์ฌ์ฉํ์ญ์์ค.
- ์ต์ ์ํ ์ ์ง: ์ ํ์ฑ๊ณผ ๊ท์ ์ค์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์ ๊ทผ์ฑ ํ์ค๊ณผ ํ ์คํธ ๋๊ตฌ๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ์ญ์์ค.
- ๊ต์ก์ ํฌ์: ๊ฐ๋ฐํ์๊ฒ ์ ๊ทผ์ฑ ๋ชจ๋ฒ ์ฌ๋ก์ ํ ์คํธ ๊ธฐ์ ์ ๋ํ ๊ต์ก์ ์ ๊ณตํ์ญ์์ค.
- ์ ๋ฌธ๊ฐ ์ง์ ์์ฒญ: ์ ๊ทผ์ฑ ์๋ํ ํ๋ก๊ทธ๋จ์ ๊ตฌํ ๋ฐ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๋๊ธฐ ์ํด ์ ๊ทผ์ฑ ์ปจ์คํดํธ๋ ์ ๋ฌธ๊ฐ์ ์ฐธ์ฌ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
์๋ํ๋ฅผ ๋์ด: ์ ๊ทผ์ฑ์ ์ธ๊ฐ์ ์์
์๋ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ์ ๊ทผ์ฑ์ ๊ถ๊ทน์ ์ผ๋ก ์ฌ๋์ ๊ดํ ๊ฒ์์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์ ์ํตํ๋ ๊ฒ์ ๊ทธ๋ค์ ์๊ตฌ๋ฅผ ์ดํดํ๊ณ ์น์ฌ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ง์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ์ง ํ์ธํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์ ์ํตํ๋ ๋ฐฉ๋ฒ:
- ์ฌ์ฉ์ ํ ์คํธ: ์ฅ์ ๊ฐ ์๋ ๊ฐ์ธ๊ณผ ์ฌ์ฉ์ ํ ์คํธ๋ฅผ ์ํํ์ฌ ์ฌ์ฉ์ฑ ๋ฌธ์ ์ ์ ๊ทผ์ฑ ์ฅ๋ฒฝ์ ์๋ณํฉ๋๋ค.
- ์ ๊ทผ์ฑ ๊ฐ์ฌ: ์ ๊ทผ์ฑ ์ ๋ฌธ๊ฐ์๊ฒ ์น์ฌ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ฌ๋ฅผ ์๋ขฐํฉ๋๋ค.
- ํผ๋๋ฐฑ ๋ฉ์ปค๋์ฆ: ์ฌ์ฉ์๊ฐ ์ ๊ทผ์ฑ ๋ฌธ์ ์ ๋ํ ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์๋๋ก ๋ช ํํ๊ณ ์ ๊ทผ ๊ฐ๋ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
- ํฌ์ฉ์ ๋์์ธ ์ค์ฒ: ๊ฐ๋ฐ ๊ณผ์ ์ ํฌ์ฉ์ ๋์์ธ ์์น์ ํตํฉํ์ฌ ์ฒ์๋ถํฐ ์ ๊ทผ์ฑ์ด ๊ณ ๋ ค๋๋๋ก ํฉ๋๋ค.
- ์ปค๋ฎค๋ํฐ ์ฐธ์ฌ: ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ์ ๋ฐฐ์ฐ๊ณ ๊ฒฝํ์ ๊ณต์ ํ๊ธฐ ์ํด ์ ๊ทผ์ฑ ์ปค๋ฎค๋ํฐ ๋ฐ ํฌ๋ผ์ ์ฐธ์ฌํฉ๋๋ค.
์ ๊ทผ์ฑ์ ์ผํ์ฑ ํด๊ฒฐ์ฑ ์ด ์๋ ์ง์์ ์ธ ๊ณผ์ ์์ ๊ธฐ์ตํ์ญ์์ค. ์๋ํ์ ์ธ๊ฐ์ ์๊ฒฌ, ๊ทธ๋ฆฌ๊ณ ์ง์์ ์ธ ๊ฐ์ ์ ๋ํ ํ์ ์ ๊ฒฐํฉํจ์ผ๋ก์จ ๋ชจ๋ ์ฌ๋์ ์ํ ์ง์ ์ผ๋ก ํฌ์ฉ์ ์ด๊ณ ์ ๊ทผ ๊ฐ๋ฅํ ์น ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค.
๊ฒฐ๋ก : ๋ ํฌ์ฉ์ ์ธ ์น์ ์ํ ์ ๊ทผ์ฑ ์๋ํ ์์ฉ
ํ๋ก ํธ์๋ ์ ๊ทผ์ฑ ์๋ํ๋ ํฌ์ฉ์ ์ด๊ณ ๊ท์ ์ ์ค์ํ๋ ์น ๊ฒฝํ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ธ ์์์ ๋๋ค. ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ์๋ํ๋ ํ ์คํธ๋ฅผ ํตํฉํจ์ผ๋ก์จ ์์ ์ฃผ๊ธฐ ์ด๊ธฐ์ ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ์ฌ ์์ ๋น์ฉ์ ์ค์ด๊ณ ์น์ฌ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ชจ๋ ์ฌ๋์๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
์๋ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๊ทธ๊ฒ์ด ํผ์ฆ์ ํ ์กฐ๊ฐ์ ๋ถ๊ณผํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ํ์ ์๋ ํ ์คํธ, ์ฌ์ฉ์ ํผ๋๋ฐฑ, ๊ทธ๋ฆฌ๊ณ ์ง์์ ์ธ ๊ฐ์ ์ ๋ํ ํ์ ์ ๊ฒฐํฉํจ์ผ๋ก์จ ๋ชจ๋ ์ฌ๋์๊ฒ ์ด์ต์ด ๋๋ ์ง์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์น ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค.
์น์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ ๊ทผ์ฑ ์๋ํ๋ฅผ ์์ฉํ๋ ๊ฒ์ ๋จ์ํ ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ์๋๋ผ ์ฑ ์์ ๋๋ค. ์ ๊ทผ์ฑ์ ์ฐ์ ์ํจ์ผ๋ก์จ ์ฐ๋ฆฌ ๋ชจ๋๋ฅผ ์ํ ๋ ํฌ์ฉ์ ์ด๊ณ ๊ณตํํ ๋์งํธ ์ธ์์ ๋ง๋ค ์ ์์ต๋๋ค.